package ScalaStudy.chapter05

case object Test06_HighOrderFunction {
  def main(args: Array[String]): Unit = {

    /////////////////////////////////////////////////////////////////////////////////////////
    ///////////////////////////////////////   高级函数   /////////////////////////////////////
    /////////////////////////////////////////////////////////////////////////////////////////

    def f(n: Int): Int = {
      println("f调用")
      n + 1
    }

    def f0(): Int = {
      println("f调用")
      1
    }

    val result: Int = f(123)
    println(result)

    //1. 函数可以作为一个值进行传递
println("(1)")

    val f1 = f _                                                   //将f这个函数传递给f1，通过将函数名后加( _)证明这是函数
    val f2 :Int => Int = f                                         //如果定义函数输入输出类型，那么不需要加( _)证明这是函数
    val f3 :() => Int = f0                                         //当没有参数时，使用()表示参数类型
    println(f1(1))
    println(f2(2))
    println(f3())

    //2. 函数作为参数进行传递,**参数中是函数**
println("(2)")

    def dualEval (op: (Int, Int) => Int, a: Int, b: Int): Int = {       //op为函数输入输出类型，a和b为传进的参数
      op(a,b)
    }

    def add(a: Int, b:Int): Int = {
      a+b
    }

    println(dualEval(add, 2, 3))                                        //调用add函数和参数
    println(dualEval((a, b) => a + b, 1, 2))                            //直接传匿名函数
    println(dualEval(_ + _, 1, 2))                                      //直接传简化匿名函数

    //3. 函数作为函数的返回值返回
println("(3)")

    def f5(): Int => Unit = {                                           //返回的是一个函数，这个函数的输入是Int型，输出是Unit
      def f6(a: Int): Unit ={
        print("f6调用" + a)
      }
      f6
    }

    println(f5())                                                        //f5()返回的是一个f6这个函数
    val f6 = f5()                                                        //f6就是f6这个函数了
    println(f6(24))                                                      //f5()返回的是一个f6这个函数，返回是Uint
    println(f5()(20))                                                    //f5()表示f6这个函数，f5()(20) == f6(20)







  }
}